package designpatterns.facade.code;

/**
 * @description:
 *  某软件公司欲开发一个可应用于多个软件的文件加密模块，该模块可以对文件中的数据进行加密并将加密之后的数据存储在一个新文件中，
 *  具体的流程包括三个部分，
 *  分别是读取源文件、加密、保存加密之后的文件，其中，读取文件和保存文件使用流来实现，加密操作通过求模运算实现。
 *  这三个操作相对独立，为了实现代码的独立重用，
 *  让设计更符合单一职责原则，这三个操作的业务代码封装在三个不同的类中。
 *
 *  现使用外观模式设计该文件加密模块。
 *  外观模式又称为门面模式，它是一种对象结构型模式。
 *  外观模式是迪米特法则的一种具体实现，通过引入一个新的外观角色可以降低原有系统的复杂度，同时降低客户类与子系统的耦合度。
 * @author: zk
 * @date: 2023-02-02 17:47
 */
public class EncryptFacade {
    private FileEncrypt fileEncrypt;
    private FileReader fileReader;
    private FileWriter fileWriter;

    public EncryptFacade() {
        this.fileEncrypt = new FileEncrypt();
        this.fileReader = new FileReader();
        this.fileWriter = new FileWriter();
    }

    public void encrypt(String fileNameSrc) {
        System.out.println("===》文件加密开始《====");
        String context = fileReader.read(fileNameSrc);
        String encryptContext = fileEncrypt.encrypt(context);
        fileWriter.write(fileNameSrc, encryptContext);
        System.out.println("===》文件加密结束《====");
    }

    public void decryption(String fileNameSrc) {
        System.out.println("===》文件解密开始《====");
        String encryptContext = fileReader.read(fileNameSrc);
        String context = fileEncrypt.decryption(encryptContext);
        fileWriter.write(fileNameSrc, context);
        System.out.println("===》文件解密结束《====");
    }

}
